package example

/*
用于签到测试：
收到任何数据都回复login success!
*/
import (
	"TCP/CRC"
	"fmt"
	"net"
)

var AesKey = []byte("CHANGSHAWATERGRO") // 加密的密钥

func AddHexArr(data []byte, start int, dst []byte, len int) int {
	for i := 0; i < len; i++ {
		data[start+i] = dst[i]
	}
	data[14] = byte((len + 1) & 0xFF)
	data[15] = byte(((len + 1) >> 8) & 0xFF)
	return start + len
}
func HexToHexStr(buf []byte) string {
	len := len(buf)
	str := ""
	for i := 0; i < len; i++ {
		if i == 0 {
			str = fmt.Sprintf("%02X", buf[i])
		} else {
			str += fmt.Sprintf(" %02X", buf[i])
		}
	}
	return str
}
func CheckCmd(buf []byte) []byte {
	SendData := make([]byte, 1024)
	AddHexArr(SendData, 0, buf, 17)
	SendData[7] = 0x00
	SendData[8] = 0x00
	SendData[9] = 0x00
	SendData[10] = 0x00
	SendData[11] = 0x10
	SendData[18] = 0x01
	length := 2
	if buf[0] == 0xAA && buf[1] == 0x96 {
		if buf[16] == 0x11 {
			SendData[17] = 0x01 //响应码
			EnDataLen := 0
			//EnData := En.AesEncryptECB(SendData[18:18], AesKey)
			//EnDataLen = len(EnData)
			//AddHexArr(SendData, 17, EnData, EnDataLen)
			length += EnDataLen                            //数据段长度
			SendData[14] = byte(length)                    //长度低
			SendData[15] = byte(length >> 8)               //长度高
			CRC := CRC.CRC16IBM(SendData, 2, 18+EnDataLen) //计算校验码
			SendData[18+EnDataLen] = byte(CRC)             //校验低
			SendData[19+EnDataLen] = byte(CRC >> 8)        //校验高
			SendData[20+EnDataLen] = 0x55                  //结束符
			SendData[21+EnDataLen] = 0x69                  //结束符
			length = 22 + EnDataLen
			//AA 96 49 17 18 05 01 00 00 00 00 10 01 00 11 00 11 A6 F3 9F 60 79 1C 93 98 97 4B C3 4A 5B 70 D2 81 B2 9D 55 69
			//SendData := []byte("\xAA\x96\x49\x17\x18\x05\x01\x00\x00\x00\x00\x00\x01\x00\x02\x00\x11\xA6\xF3\x9F\x60\x79\x1C\x93\x98\x97\x4B\xC3\x4A\x5B\x70\xD2\x81\x23\x17\x55\x69")
			//copy(data, SendData)
			//length = len(SendData)
		}
	}
	return SendData[:length]
}
func process(con net.Conn) { //多线程接收数据
	//循环接收客户端发送的数据
	defer con.Close() //关闭con
	for {
		//创建一个新的切片
		buf := make([]byte, 1024)
		//1.等待客户端通过con发送信息
		//2.如果客户端没有write[发送]，协程就会阻塞于此
		fmt.Printf("服务器等待客户端 %s 发送信息\n", con.RemoteAddr().String())
		n, err := con.Read(buf)
		if err != nil {
			fmt.Println("clien exit,err:", err)
			return
		} else {
			//3.服务器显示客户端信息
			fmt.Printf("RECV len: %03d data: %s\n", n, HexToHexStr(buf[:n]))

			//decrypted := En.AesDecryptECB(buf[17:n-4], AesKey)
			//AddHexArr(buf, 17, decrypted, len(decrypted))
			//fmt.Printf("明文 len: %03d data: %s\n", 17+len(decrypted), HexToHexStr(buf[:17+len(decrypted)]))
			//sendData := CheckCmd(buf[:17+len(decrypted)])
			sendData := []byte("login success!")
			if len(sendData) != 0 {
				//fmt.Printf("SEND: len: %03d data: %s\n", len(sendData), HexToHexStr(sendData))
				con.Write(sendData)
			}
		}
	}

}
func main() {
	fmt.Println("start listen at TCP  120.25.102.158:7274")
	//1.tcp表示使用网络协议是tcp
	//2.0.0.0.0:8888表示在本地监听8888端口
	lister, err := net.Listen("tcp", "0.0.0.0:7274")
	if err != nil {
		fmt.Println("listen err: ", err)
		return
	}

	defer lister.Close() //延时关闭listen

	//循环等待客户端连接
	for {
		//等待客户端连接
		fmt.Println("wait for connect...")
		conn, err := lister.Accept()
		if err != nil {
			fmt.Printf("Accept() err", err)
		} else {
			fmt.Printf("Accept() suc conn=%v,客户端IP=%v\n", conn, conn.RemoteAddr().String())
		}
		go process(conn)
	}
}
